package com.gk.guinyote;



import java.util.Random;

import android.util.Log;

import com.gk.guinyote.Baraja.Carta;

public class Partida {
	private Baraja mibaraja;
	private Carta triunfo;
	private Jugador[] jugadores;
	private int idJugador; // Para indicar el jugador actual
	private int rondas;
	
	public int getIdJugador() {
		return idJugador;
	}


	public void setIdJugador(int idJugador) {
		this.idJugador = idJugador;
	}

	
	public int getRondas() {
		return rondas;
	}


	public Partida(){
		Random randomGenerator = new Random();
		idJugador = randomGenerator.nextInt(4);
		rondas = 0;
		mibaraja = new Baraja();
		triunfo = mibaraja.randomCard();
		jugadores = new Jugador[4];
		for (int i=0;i<4;i++){
			jugadores[i] = new Jugador(i,"Jugador "+ (i+1));
		}
		Log.d("Triunfo",this.getTriunfo().toString());
	}
	
	
	public Carta getTriunfo() {
		return triunfo;
	}

	public void setTriunfo(Carta triunfo) {
		this.triunfo = triunfo;
	}


	public Baraja getMibaraja() {
		return mibaraja;
	}

	public void setMibaraja(Baraja mibaraja) {
		this.mibaraja = mibaraja;
	}
	
	public Jugador getJugadorById(int id){
		if (id>=0 && id<4){
			return jugadores[id];
		}
		else
			return null;
	}
	
	public void comenzarPartida(){
		for(int j = 0; j<jugadores.length; j++){
			for(int i=0 ; i<6; i++){
				jugadores[j].robarCarta(mibaraja.randomCard());
			}
		}
	}
	
	private void turnoSiguiente(){
		if(getRondas()<4){
			for(int i=0; i<4; i++){
				if(this.mibaraja.numCartasBaraja() == 0)
					this.getJugadorActual().robarCarta(this.triunfo);
				else{
					this.getJugadorActual().robarCarta(mibaraja.randomCard());
					this.jugadorSiguiente();
				}
			}
		}
		else{ //Arrastre
			this.jugadorSiguiente();
			if(this.getJugadorActual().getMano().size() == 0){
				this.finPartida();
			}
		}
		rondas++;
	}
	
	private void finPartida() {
		// TODO Auto-generated method stub
		
	}


	public Jugador getJugadorActual(){
		return this.jugadores[idJugador];
	}
	
	public void jugadorSiguiente(){
		this.idJugador = (this.idJugador + 1)%4;
	}
	
	public Jugada resuelveTurno(Jugada[] _jugada){ // Devuelve la carta ganadora de la jugada suma los puntos y pasa al turno siguiente
		Jugada max = jugadaGanadora(_jugada, _jugada.length, true);
		
		this.idJugador = max.getJugador().getId();
		Log.d("Ganadora",max.getCartaJugada().toString());
		this.turnoSiguiente();
		return max;
	}
	
	public Jugada jugadaGanadora(Jugada [] _jugada, int _n, boolean sumaPuntos){
		Jugada max = _jugada[0];
		String palo = _jugada[0].getCartaJugada().getPalo();
		int puntosBaza = max.getCartaJugada().getValor();
		Log.d("Jugada",_jugada[0].getJugador().toString() + " juega " + _jugada[0].getCartaJugada().toString());
		
		for (int i=1; i<_n; i++){
			Log.d("Jugada",_jugada[i].getJugador().toString() + " juega " + _jugada[i].getCartaJugada().toString());
			puntosBaza += _jugada[i].getCartaJugada().getValor();
			if (max.getCartaJugada().getPalo() == this.getTriunfo().getPalo()){ //max es triunfo
				if(_jugada[i].getCartaJugada().getPalo() == this.getTriunfo().getPalo()) //la que se mira es triunfo
					if(_jugada[i].getCartaJugada().getValor() > max.getCartaJugada().getValor())
						max = _jugada[i];
					else{ 
						if(_jugada[i].getCartaJugada().getValor() == max.getCartaJugada().getValor()){ //Son del mismo valor
							if(_jugada[i].getCartaJugada().getNumero() > max.getCartaJugada().getNumero()){
								max = _jugada[i];
							}								
						}
					}
			}

			else{	//max no es triunfo
				if(_jugada[i].getCartaJugada().getPalo() != this.getTriunfo().getPalo()){
					if(_jugada[i].getCartaJugada().getPalo() == palo){ //si la carta jugada es del mismo palo que la que gana
						if(_jugada[i].getCartaJugada().getValor() > max.getCartaJugada().getValor())
							max = _jugada[i];
						else{ 
							if(_jugada[i].getCartaJugada().getValor() == max.getCartaJugada().getValor()){ //Son del mismo valor
								if(_jugada[i].getCartaJugada().getNumero() > max.getCartaJugada().getNumero()){
									max = _jugada[i];
								}	
							}
						}
					}
				}
				else{
					max = _jugada[i];
				}

			}
		}
		if (sumaPuntos){
			this.jugadores[max.getJugador().getId()].sumaPuntuacion(puntosBaza);
			if (this.rondas == 10){ //Las 10 ultimas
				this.jugadores[max.getJugador().getId()].sumaPuntuacion(10);
			}
		}
		return max;
	}
	
}
